package com.jvyou.mybatis.session;

import com.jvyou.mybatis.builder.ConfigBuilder;
import com.jvyou.mybatis.builder.XmlBindMapperConfigBuilder;
import com.jvyou.mybatis.session.defaults.DefaultSqlSessionFactory;

import java.io.InputStream;

/**
 * @author 橘柚
 * @version 1.0-SNAPSHOT
 * @Date 2024/4/28 21:44
 * @Description SqlSession 工厂构建者
 */
public class SqlSessionFactoryBuilder {
    /**
     * 默认使用 XML 构建 SqlSessionFactory，如果什么都不传递的话，默认使用 mybatis-config.xml 作为配置文件的名称
     *
     * @return 会话工厂
     */
    public SqlSessionFactory build() {
        return build("mybatis-config.xml");
    }


    /**
     * 默认会从类路径的资源陌路下读取指定配置文件名的xml文件
     *
     * @param configName 配置文件名
     * @return 会话工厂
     */
    public SqlSessionFactory build(String configName) {
        return build(configName, null);
    }

    /**
     * 默认会从类路径的资源陌路下读取指定配置文件名的xml文件
     *
     * @param configName 配置文件名
     * @return 会话工厂
     */
    public SqlSessionFactory build(String configName, String environmentId) {
        InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(configName);
        return build(is, environmentId);
    }

    /**
     * 不使用 XML 构建 SqlSessionFactory
     *
     * @param config mybatis 核心配置类
     * @return 会话工厂
     */
    public SqlSessionFactory build(Configuration config) {
        return build();
    }


    /**
     * 使用 XML 构建 SqlSessionFactory，传递输入流
     *
     * @param inputStream 配置文件的输入流
     * @return 会话工厂
     */
    public SqlSessionFactory build(InputStream inputStream) {
        return build(inputStream, null);
    }


    /**
     * 使用 XML 构建 SqlSessionFactory，传递输入流和环境id
     *
     * @param inputStream   配置文件的输入流
     * @param environmentId 环境id
     * @return 会话工厂
     */
    public SqlSessionFactory build(InputStream inputStream, String environmentId) {
        ConfigBuilder xmlConfigBuilder = new XmlBindMapperConfigBuilder(inputStream, environmentId);
        Configuration configuration = xmlConfigBuilder.parse();
        return new DefaultSqlSessionFactory(configuration);
    }
}
